// G4提供的头文件
#include "G4Box.hh"                 // G4的长方体几何体
#include "G4Orb.hh"                 // G4的球形几何体
#include "G4Tubs.hh"                // G4的圆柱体
#include "G4LogicalVolume.hh"       // G4的逻辑体
#include "G4PVPlacement.hh"         // G4的物理实体摆放器
#include "G4SystemOfUnits.hh"       // G4系统单位制
#include "G4NistManager.hh"         // G4材料查找表
#include "G4Material.hh"            // G4材料
#include "G4VisAttributes.hh"       // G4逻辑体外观管理器
#include "G4Color.hh"               // G4的颜色
#include "G4RotationMatrix.hh"      // G4旋转矩阵
// 用户编写的头文件
#include "G4ExtensionDetectorConstruction.hh"

// G4物理建模函数
G4VPhysicalVolume * G4ExtensionDetectorConstruction::Construct(){

    // 创建材料查找表
    auto nistManager = G4NistManager::Instance();

    // 检查边界冲突的变量控制
    G4bool checkOverlaps = true;

    /***********************创建G4 World**********************************/
    // 创建World几何体
    auto * solid_world = new G4Box("world",
                                    0.5*m,
                                    0.5*m,
                                    0.5*m);
    // 创建World逻辑体
    auto * logic_world = new G4LogicalVolume(solid_world,           
                                             nistManager->FindOrBuildMaterial("G4_AIR"),
                                             "world");
    // 创建world物理体
    auto * physical_world = new G4PVPlacement(0,
                                              G4ThreeVector(0,0,0),
                                              logic_world,
                                              "world",
                                              0,
                                              false,
                                              0,
                                              checkOverlaps);
 
    /***********************NaI探测器**********************************/
    // 创建NaI探测器几何体
    auto * solid_nai = new G4Tubs("nai",        // 几何柱体名
                                    0*cm,       // 内径
                                    0.25*cm,    // 外径
                                    0.25*cm,    // 柱体的半高
                                    0*deg,      // 起始角度
                                    360*deg);   // 扇形扫掠的角度，这里设置为 360 度表示完整的圆形
    // 创建NaI探测器逻辑体
    auto * logic_nai = new G4LogicalVolume(solid_nai,     // 待填充的几何体
                                            nistManager->FindOrBuildMaterial("G4_SODIUM_IODIDE"),         // 填充材料
                                            "nai");        // 逻辑体名

    // 配置NaI探测器外观
    auto * visAttributs_nai = new G4VisAttributes(G4Color::White());   // 颜色为红色
    visAttributs_nai->SetVisibility(true);                             // 打开外观显示
    visAttributs_nai->SetForceSolid(true);                             // 外观设置为实心全填充
    logic_nai->SetVisAttributes(visAttributs_nai);                     // 外观信息配置到logic_wine

    // 创建NaI探测器物理体
    G4RotationMatrix* rotationMatrix = new G4RotationMatrix();      // 定义一个旋转矩阵
    rotationMatrix->rotateX(90*deg);                                // 绕x轴旋转30°
    auto * physical_nai = new G4PVPlacement(rotationMatrix,                 // 是否旋转
                                             G4ThreeVector(0,10*cm,0),      // 摆放位置
                                             logic_nai,                     // 待摆放的逻辑体
                                             "nai",                        // 物理实体名
                                             logic_world,                   // 母体
                                             false,                         // 不镜像
                                             2,                             // 物理实体编号
                                             checkOverlaps);                // 打开边界冲突检查

    // 设置敏感体积
    fScoringVolume = logic_nai;        // 将敏感体积设置为logic_nai

    // 返回世界
    return physical_world;              // 将整个world交给runmanager

}

// 用于其他类获取设置的敏感体积的成员函数
G4LogicalVolume* G4ExtensionDetectorConstruction::GetScoringVolume() const{

    // 外部类获取敏感体积的函数
    return fScoringVolume;

}